import { create } from "zustand";
import { persist } from "zustand/middleware";
import themes, { type IThemesItem } from "../configs/themes";

// 基本仓库的参数类型
interface IUseBasicStore {
  // 加载中
  loading: boolean
  setLoading: (bol: boolean) => void

  // 主题
  theme: string
  setTheme: (newTheme: string) => void
  getTheme: () => IThemesItem
}

/**
 * 基本仓库
 * create: 创建仓库的函数, 可以传入一个类型参数用于限制管理的状态
 * 二次调用是为了使用persist这些中间件
 */
export const useBasicStore = create<IUseBasicStore>()(
  // persist: zustand中用于让状态持久化存储的中间件
  persist(
    // 有set和get两个参数
    // set可以直接传入含有需要改变字段的对象用于改变这个字段的状态
    // get用于在仓库内获取最新的状态
    ((set, get) => ({
      // 加载中
      loading: false,
      // 设置加载中函数
      setLoading (bol) {
        set({ loading: bol })
      },
      // 主题
      theme: 'white',
      setTheme (newTheme: string) {
        set({ theme: newTheme })
      },
      getTheme () {
        return themes?.[get().theme]
          ? themes[get().theme]
          : themes.white
      }
    })),
    // 可用于设置持久化存储时的键名
    {
      name: 'basic-info',
      partialize: ((state) => ({
        loading: state.loading,
        theme: state.theme,
      }))
    }
  )
)
